home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_12_02
/
smith
/
calc9_11.c
< prev
next >
Wrap
Text File
|
1993-12-29
|
1KB
|
39 lines
#define BASE 94 /* # possible output chars */
#define FIRST_CODE '!' /* lowest output char */
#define PBASE 56 /* prefix base */
#define BASESQ (unsigned long)(BASE*BASE)
#define MAKE_PRINT(c) (char)((c)+FIRST_CODE)
#define CV2ASCII(p,v) (*(p)=MAKE_PRINT((v)/BASE), \
*(p+1)=MAKE_PRINT((v)%BASE))
#define PBMULT (unsigned)(((0xffffffffUL/PBASE)>>16)+1)
...
/* Encode 9 bytes into 11 printable ASCII chars. */
unsigned long block; /* conversion area */
int i; /* input byte index */
unsigned int qb = 0; /* prefixes */
ldiv_t ld; /* quotient, remainder */
for (i = 1; i < 9; i += 4) {
unsigned q;
block = ((unsigned long)
(((unsigned)in[i+0]<<8) | in[i+1])<<16)+
(((unsigned) in[i+2]<<8) | in[i+3]);
q = (unsigned) (block >> 16) / PBMULT;
block = block- ((unsigned long)(q*PBMULT) << 16);
ld = ldiv ((long) block, (long) BASESQ);
CV2ASCII(out+i+2, (unsigned) ld.quot);
CV2ASCII(out+i+4, (unsigned) ld.rem);
qb = qb * PBASE + q;
}
/* Now convert the remaining byte and prefixes
* from previous block conversions */
block = ((unsigned long) qb << 8) | in[0];
ld = ldiv ((long) block, (long) BASESQ);
out[0] = MAKE_PRINT((unsigned) ld.quot);
CV2ASCII(out+1, (unsigned) ld.rem);
/* End of File */